package com.sleepapp.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author ziluxike
 * @since 2025/5/26 10:42
 */
@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {
    /**
     * ajax跨域请求
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 添加映射路径
        registry.addMapping("/**")
                // 是否发送Cookie
                .allowCredentials(true)
                // 设置放行哪些原始域
                .allowedOriginPatterns("*")
                // 放行哪些请求方式
                // 或者放行全部
                .allowedMethods("*")
                // 放行哪些原始请求头部信息
                .allowedHeaders("*")
                // 暴露哪些原始请求头部信息
                .exposedHeaders("*");
    }

    /**
     * 配置fastJson作为Spring MVC的HttpMessageConverter，用于序列化和反序列化HTTP请求和响应体。
     * 该方法覆盖了WebMvcConfigurer接口的默认实现，以自定义fastJson的配置。
     *
     * @param converters 一个HttpMessageConverter列表，用于处理HTTP消息的序列化和反序列化。
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 移除默认的Jackson2HttpMessageConverter，以使用fastJson代替。
        converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);

        // 创建fastJson的HttpMessageConverter实例。
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();

        // 配置fastJson的设置，包括序列化特性、日期格式等。
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteDateUseDateFormat,
                SerializerFeature.DisableCircularReferenceDetect);
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");

        // 设置支持的媒体类型为JSON。
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);

        // 将配置应用到fastJsonHttpMessageConverter。
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);

        // 添加fastJsonHttpMessageConverter到转换器列表中。
        converters.add(fastJsonHttpMessageConverter);

        // 调用超类方法，以确保其他必要的配置也被应用。
        WebMvcConfigurer.super.configureMessageConverters(converters);
    }


}
